// 给定一棵树，结点由 1 至 n 编号，其中结点 1是树根。树的每个点有一个颜色Ci。
// 如果一棵树中存在的每种颜色的结点个数都相同，则我们称它是一棵颜色平衡树。
// 求出这棵树中有多少个子树是颜色平衡树。

// 输入的第一行包含一个整数n，表示树的结点数。
// 接下来n行，每行包含两个整数 Ci,Fi，用一个空格分隔，表示第 i个结点的颜色和父亲结点编号。
// 特别地，输入数据保证 F1 为0，也即 1 号点没有父亲结点。保证输入数据是一棵树。

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
 
/*节点结构体*/
//color为颜色值，dp为当前节点的子树中颜色平衡树的数量，count用于存储各颜色数量，child为子节点
struct TreeNode {
    int color;
    map<int,int> count;
    vector<TreeNode*> child;
    TreeNode(int c) :color(c) {};
};
 
//后序遍历树
int postorder(TreeNode* root) {
 
    //当遇到叶子节点时返回
    if (root->child.empty()) {
        root->count[root->color]++;
        return 1;
    }
    int sum = 0;
 
    //遍历当前节点的子节点，将子节点的颜色平衡树累加，并将子节点的颜色计数加入当前节点的颜色计数
    for (vector<TreeNode*>::iterator i = root->child.begin(); i != root->child.end(); i++) {
        sum += postorder(*i);
        for (map<int,int>::iterator j = (*i)->count.begin(); j != (*i)->count.end(); j++)
            root->count[j->first] += j->second;
    }
 
    //将当前节点的颜色加入计数
    root->count[root->color]++;
 
    //遍历颜色计数map，为颜色平衡树时令当前节点的dp+1
 
    int record = root->count.begin()->second;
    int c = 1;
    for (map<int,int>::iterator it = root->count.begin(); it != root->count.end(); it++)
    {
        if (it->second != record) {
            c = 0;
            break;
        }
    }
 
    return sum + c;
}
 
int main()
{
    int n;
    cin.sync_with_stdio(false);
    cin.tie(0);
    cin >> n;
    vector<TreeNode*> tree;
    int tmp, fat;
    cin >> tmp >> fat;
    TreeNode* root = new TreeNode(tmp);
    tree.push_back(root);
    for (int i = 1; i < n; i++) {
        int tmp, fat;
        cin >> tmp >> fat;
        TreeNode* node = new TreeNode(tmp);
        tree[fat - 1]->child.push_back(node);
        tree.push_back(node);
    }
    int sum = postorder(root);
    cout << sum;
    return 0;
}